'use strict';

process.env.NODE_ENV = 'production';

const { say } = require('cfonts');
const chalk = require('chalk');
const del = require('del');
const { spawn } = require('child_process');
const webpack = require('webpack');
const Multispinner = require('multispinner');

const mainConfig = require('./webpack.main.config');
const rendererConfig = require('./webpack.renderer.config');
const webConfig = require('./webpack.web.config');

const doneLog = chalk.bgGreen.white(' DONE ') + ' ';
const errorLog = chalk.bgRed.white(' ERROR ') + ' ';
const okayLog = chalk.bgBlue.white(' OKAY ') + ' ';
const isCI = process.env.CI || false;

if (process.env.BUILD_TARGET === 'clean') clean();
else if (process.env.BUILD_TARGET === 'web') web();
else build();

function clean() {
  del.sync(['build/*', '!build/icons', '!build/icons/icon.*']);
  process.exit();
}

function build() {
  greeting();

  del.sync(['dist/electron/*', '!.gitkeep']);

  const tasks = ['main', 'renderer'];
  const m = new Multispinner(tasks, {
    preText: 'building',
    postText: 'process'
  });

  let results = '';

  m.on('success', () => {
    process.stdout.write('\x1B[2J\x1B[0f');
    process.exit();
  });

  pack(mainConfig)
    .then(result => {
      results += result + '\n\n';
      m.success('main');
    })
    .catch(err => {
      m.error('main');
      process.exit(1);
    });

  pack(rendererConfig)
    .then(result => {
      results += result + '\n\n';
      m.success('renderer');
    })
    .catch(err => {
      m.error('renderer');
      process.exit(1);
    });
}

function pack(config) {
  return new Promise((resolve, reject) => {
    webpack(config, (err, stats) => {
      if (err) reject(err.stack || err);
      else if (stats.hasErrors()) {
        let err = '';

        stats
          .toString({
            chunks: false,
            colors: true
          })
          .split(/\r?\n/)
          .forEach(line => {
            err += `    ${line}\n`;
          });

        reject(err);
      } else {
        resolve(
          stats.toString({
            chunks: false,
            colors: true
          })
        );
      }
    });
  });
}

function web() {
  del.sync(['dist/web/*', '!.gitkeep']);
  webpack(webConfig, (err, stats) => {
    if (err || stats.hasErrors()) console.log(err);
    process.exit();
  });
}

function greeting() {
  const cols = process.stdout.columns;
  let text = '';

  if (cols > 85) text = 'lets-build';
  else if (cols > 60) text = 'lets-|build';
  else text = false;

  if (text && !isCI) {
    say(text, {
      colors: ['yellow'],
      font: 'simple3d',
      space: false
    });
  }
}
